﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using BookStore.Solution.Entities;
using BookStore.Solution.BLL;
using BookStore.Solution.Utilities;

namespace BookStore.Solution.Presentation
{
    public partial class frmAccount : DevComponents.DotNetBar.OfficeForm
    {
        bool IsAdded = true;
        EmployeeManager Employees = new EmployeeManager();
        AccountManager Accounts = new AccountManager();
        RoleManager role = new RoleManager();
        public Account NewAccount { get; set; }
        List<Role> li;
        #region form event
        public frmAccount()
        {
            InitializeComponent();
        }

        public frmAccount(Account a)
        {
            InitializeComponent();
            NewAccount = a;
            IsAdded = false;
        }

        private void frmAccount_Load(object sender, EventArgs e)
        {
            cbStatus.Items.Add("Khả dụng");
            cbStatus.Items.Add("Đang đăng nhập");
            cbStatus.Items.Add("Bị khóa");
            LoadForm();
        }

        private void btnSubmit_Click(object sender, EventArgs e)
        {
            if (IsAdded)
            {
                string check = ValidatedData();
                if (check == "")
                {
                    NewAccount = GetAccount();
                    String s = Accounts.Insert(NewAccount);
                    MessageBox.Show(s);
                    if (s == "Thêm thành công")
                        Close();
                }
                else
                {
                    NewAccount = null;
                    MessageBox.Show(check, "Nhập thiếu thông tin", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
            {
                NewAccount = GetAccount();
                String s = Accounts.UpdateRoles(NewAccount);
                MessageBox.Show(s);
                if (s == "Cập nhật thành công")
                    Close();
            }
        }

        private void btnReset_Click(object sender, EventArgs e)
        {
            ResetForm();
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            NewAccount = null;
            Close();
        }

        private void quyềnQuảnLýToolStripMenuItem_Click(object sender, EventArgs e)
        {
            SetCheckedforAll(true);
        }

        private void quyềnThủKhoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            SetCheckedforAll(false);
            List<string> listRole = new List<string>();
            listRole.Add("Thêm, xóa, cập nhật  phiếu nhập");
            listRole.Add("Tìm kiếm phiếu nhập");
            listRole.Add("Thêm, xóa, cập nhật  sách");
            listRole.Add("Tìm kiếm sách");
            listRole.Add("Thêm, xóa, cập nhật  vpp");
            listRole.Add("Tìm kiếm vpp");
            listRole.Add("Thêm, xóa, cập nhật  danh mục");
            listRole.Add("Tìm kiếm danh mục");
            listRole.Add("Thêm, xóa, cập nhật  tác giả");
            listRole.Add("Tìm kiếm tác giả");
            listRole.Add("Thêm, xóa, cập nhật  nhà xuất bản");
            listRole.Add("Tìm kiếm nhà xuất bản");
            listRole.Add("Thêm, xóa, cập nhật nhà cung cấp");
            listRole.Add("Tìm kiếm nhà cung cấp");
            SetChecked(listRole);
        }

        private void quyềnThuNgânToolStripMenuItem_Click(object sender, EventArgs e)
        {
            SetCheckedforAll(false);
            List<string> listRole = new List<string>();
            listRole.Add("Thêm, xóa, cập nhật hóa đơn");
            listRole.Add("Tìm kiếm hóa đơn");
            listRole.Add("Tìm kiếm sách");
            listRole.Add("Tìm kiếm vpp");
            SetChecked(listRole);
        }

        private void quyềnKếToánToolStripMenuItem_Click(object sender, EventArgs e)
        {
            SetCheckedforAll(false);
            List<string> listRole = new List<string>();
            listRole.Add("Xem thống kê");
            listRole.Add("Thêm, xóa, cập nhật chi tiêu");
            listRole.Add("Tìm kiếm chi tiêu");
            listRole.Add("Tìm kiếm hóa đơn");
            listRole.Add("Tìm kiếm phiếu nhập");
            SetChecked(listRole);
        }
        #endregion
        #region process
        /*
         * Hàm kiểm tra thông tin của form đăng nhập
         */
        private string ValidatedData()
        {
            ResetBorderColor();
            string t = "";
            if (txtUserName.Text == "")
            {
                //chỉnh màu của ô nhập sai thành màu đỏ
                txtUserName.Border.BorderColor = Color.Red;
                t += "Tên đăng nhập rỗng. ";
            }
            if (txtPassword.Text == "" || (txtPassword.Text.Length < 8 || txtPassword.Text.Length > 32))
            {
                txtPassword.Border.BorderColor = Color.Red;
                t += "Mật khẩu không đúng định dạng. ";
            }
            return t;
        }

        /*
         * Lấy thông tin tài khoản từ form
         */
        private Account GetAccount()
        {
            Account a = new Account();
            a.EmployeeID = DataUtil.ToString(cbEmployee.SelectedValue, "");
            a.UserName = txtUserName.Text;
            a.Password = txtPassword.Text;
            a.Status = cbStatus.SelectedItem.ToString();
            foreach (Role r in GetSelectRole())
                a.Roles.Add(r);
            return a;
        }

        /*
         * Hàm reset các thông số của form về mặc định
         */
        private void ResetForm()
        {
            txtPassword.Text = "12345678";
            txtUserName.Text = "";
            cbEmployee.SelectedIndex = 0;
            cbStatus.SelectedIndex = 0;
            ResetBorderColor();
        }

        /*
         * cài đặt màu viền các ô sai quy định về màu mặc định
         */
        private void ResetBorderColor()
        {
            txtUserName.Border.BorderColor = StyleManager.ColorTint;
            txtPassword.Border.BorderColor = StyleManager.ColorTint;
        }

        private void LoadForm()
        {
            DataTable EmployeeList = Employees.GetAll();
            //nếu không có nhân viên nào thì thông báo lỗi, đóng form
            if (EmployeeList.Rows.Count == 0)
            {
                MessageBox.Show("Không có nhân viên nào!!!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Close();
            }
            cbEmployee.DataSource = EmployeeList;
            cbEmployee.ValueMember = "EmployeeID";
            cbEmployee.DisplayMember = "EmployeeName";
            li = role.GetAllRole();
            clbRoles.Items.Clear();
            foreach (Role r in li)
            {
                clbRoles.Items.Add(r.RoleName, false);
            }
            ResetForm();
            if (!IsAdded)
            {

                NewAccount = Accounts.GetSingle(NewAccount.UserName);
                btnReset.Enabled  = false;
                btnSubmit.Text = "Cập nhật";
                txtPassword.Enabled = txtUserName.Enabled = cbEmployee.Enabled = cbStatus.Enabled = false;
                txtPassword.Text = NewAccount.Password;
                txtUserName.Text = NewAccount.UserName;
                cbEmployee.SelectedValue = NewAccount.EmployeeID;
                cbStatus.Text = NewAccount.Status;
                Role[] roles = new Role[NewAccount.Roles.Count];
                NewAccount.Roles.CopyTo(roles, 0);
                for (int i = 0; i < roles.Length; i++)
                {
                    CheckRole(roles[i].RoleName);
                }
            }
        }
        private void CheckRole(string role)
        {
            for (int i = 0; i< clbRoles.Items.Count; i++)
            {
                if (clbRoles.Items[i].ToString() == role)
                {
                    clbRoles.SetItemChecked(i, true);
                    return;
                }
            }
        }
        private Role[] GetSelectRole()
        {
            Role[] result = new Role[clbRoles.CheckedItems.Count];
            for (int i = 0; i < clbRoles.CheckedItems.Count; i++)
            {
                result[i] = GetRoleByName(clbRoles.CheckedItems[i].ToString());
            }
            return result;
        }
        private Role GetRoleByName(string name)
        {
            Role result = null;
            foreach (Role e in li)
            {
                if (e.RoleName == name)
                {
                    result = e;
                    break;
                }
            }
            return result;
        }
        private void SetCheckedforAll(bool isChecked)
        {
            for (int i = 0; i < clbRoles.Items.Count; i++)
            {
                clbRoles.SetItemChecked(i, isChecked);
            }
        }
        private void SetChecked(List<string> listRole)
        {
            for (int i = 0; i < clbRoles.Items.Count; i++)
            {
                if (listRole.Contains(clbRoles.Items[i].ToString()))
                    clbRoles.SetItemChecked(i, true);
            }
        }
        #endregion

        
    }
}